package com.zyl.blog.common.config;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.unit.DataSize;

import java.util.ArrayList;
import java.util.List;

/**
 * @version v1.0
 * @ProjectName: Personal_Blog
 * @Package: com.zyl.common.config
 * @ClassName: UploadConfig
 * @Description:
 * @Author FinalFantasy
 * @Date 2025/3/10-22:19
 */
@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "upload")
public class UploadConfig {
    /**
     * 安全相关配置
     */
    private SecurityConfig security = new SecurityConfig();

    /**
     * 存储相关配置
     */
    private StorageConfig storage = new StorageConfig();

    /**
     * 安全配置子类
     */
    @Getter
    @Setter
    public static class SecurityConfig {
        /**
         * 是否启用安全限制
         */
        private boolean enabled = true;

        /**
         * 允许上传的IP段（CIDR表示法）
         */
        private List<String> allowedIps = new ArrayList<>();

        /**
         * 上传速率限制（请求数/分钟）
         */
        private int rateLimit = 100;
    }

    /**
     * 存储配置子类
     */
    @Getter
    @Setter
    public static class StorageConfig {
        /**
         * 临时存储目录（默认系统临时目录）
         */
        private String tempDir = System.getProperty("java.io.tmpdir");

        /**
         * 全局最大文件大小（默认100MB）
         */
        private DataSize maxFileSize = DataSize.ofMegabytes(100);

        /**
         * 是否保留原始文件名（默认false）
         */
        private boolean keepOriginalName = false;

        /**
         * 自动清理临时文件（默认开启）
         */
        private boolean autoCleanTemp = true;
    }

    // 工具方法：将DataSize转换为字节数
    public long getMaxFileSizeBytes() {
        return storage.getMaxFileSize().toBytes();
    }

    // 工具方法：格式化文件大小
    public String formatSize(long bytes) {
        if (bytes < 1024) return bytes + "B";
        int exp = (int) (Math.log(bytes) / Math.log(1024));
        String pre = "KMGTPE".charAt(exp-1) + "i";
        return String.format("%.1f %sB", bytes / Math.pow(1024, exp), pre);
    }
}
